Godot3 プレイヤーショットでタイルマップのコリジョンタイルを破壊
https://gyazo.com/c3b162bbfee90a6cb50287444a6f2344
かなり苦戦
無理やり解決した気がする。もっといい方法があると思うのだが...
TimeMapを、GroundとBreakbleにレイヤー分け
Breakbleレイヤー側に、コリジョンを持つタイルを設置する
https://gyazo.com/4ba344a20f7d4718f484b27a75d53f58
PlayerBulletのコリジョンを狭く調整
このコリジョン範囲が大きいと、衝突したタイルマップの位置がずれてうまくいかなかったので
https://gyazo.com/9ecf5a1562a00680851f7f1a485aa931
PlayerBulletのbody_enteredシグナルで、breakble_tileとの接触をチェック
code:PlayerBullet.py
func _on_PlayerBullet_body_entered(body):
if body.is_in_group("breakble_tile"):
# position は弾の位置
# Vector2(8,0)は、弾SpriteのOffset
# TimeMapがスクロールしているので、body.global_positionでその差分を吸収
var map_pos = body.world_to_map(position + Vector2(8,0) - body.global_position)
if body.get_cellv(map_pos) == -1:
print("タイルマップを取得できなかった")
return
body.set_cellv(map_pos, -1)
queue_free()
今回の実装では、縦スクロールでタイルマップの座標を動かしているので、動的に座標を取得する処理が複雑になった
スクロールを無くしたら簡単に解決するのだが、スクロールは必須条件のためなくせない。
これでGIF画像のようにプレイヤーショットでタイルマップが壊れるようになった
body.set_cellv(map_pos, -1) でタイルを無くしている
半壊状態のスプライトを用意したい場合は、もっと調整する必要あり。オートタイルを使う?